package com.hmall.item.web;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmall.common.dto.PageDTO;
import com.hmall.item.pojo.Item;
import com.hmall.item.service.IItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * @Author www
 * @Description 商品Controller层
 * @Date 2023/4/11 11:03
 * @Version 1.0
 */
@RestController
@RequestMapping("item")
public class ItemController {

    /**
     * 注入itemService
     */
    @Autowired
    private IItemService itemService;

    /**
     * 根据id查询商品
     * @param id 商品id
     * @return 返回数据
     */
    @GetMapping("{id}")
    public Item queryItemById(@PathVariable("id") Long id) {
        return itemService.getById(id);
    }

    /**
     * 商品分页查询
     * @param page 当前页面
     * @param size 每页大小
     * @return 返回数据
     */
    @GetMapping("/list")
    public PageDTO<Item> queryItemByPage(@RequestParam("page") Integer page, @RequestParam("size") Integer size) {
        // 分页查询
        Page<Item> result = itemService.page(new Page<>(page, size));
        // 封装并返回
        return new PageDTO<>(result.getTotal(), result.getRecords());
    }

    /**
     * 根据id进行聚合查询
     * @param minPrice 最小价格
     * @param maxPrice 最大价格
     * @param category 分类
     * @return 返回数据
     */
    @GetMapping("/query")
    public List<Item> queryItemById(
            @RequestParam("minPrice") Integer minPrice,
            @RequestParam("maxPrice") Integer maxPrice,
            @RequestParam("category") String category
    ) {
        return itemService.query() // where category = ? and price > ? and price < ?
                .eq("category", category)
                .ge("price", minPrice)
                .le("price", maxPrice).list();
    }

    /**
     * 新增商品
     * @param item
     */
    @PostMapping
    public void saveItem(@RequestBody Item item) {
        // 基本数据
        item.setCreateTime(new Date());
        item.setUpdateTime(new Date());
        item.setStatus(2);
        // 新增
        itemService.save(item);
    }

    /**
     * 根据商品id修改上下架状态
     * @param id 商品id
     * @param status 上下架状态
     */
    @PutMapping("/status/{id}/{status}")
    public void updateItemStatus(@PathVariable("id") Long id, @PathVariable("status") Integer status){
        itemService.updateStatus(id, status);
    }

    /**
     * 根据id修改商品
     * @param item 商品
     */
    @PutMapping
    public void updateItem(@RequestBody Item item) {
        // 基本数据
        item.setUpdateTime(new Date());
        // 不允许修改商品状态，所以强制设置为null，更新时，就会忽略该字段
        item.setStatus(null);
        // 更新
        itemService.updateById(item);
    }

    /**
     * 根据商品id删除商品
     * @param id 商品id
     */
    @DeleteMapping("{id}")
    public void deleteItemById(@PathVariable("id") Long id) {
        itemService.removeById(id);
    }

    /**
     * 扣减库存
     * @param itemId 商品id
     * @param num 库存
     */
    @PutMapping("/stock/{itemId}/{num}")
    public void updateStock(@PathVariable("itemId") Long itemId, @PathVariable("num") Integer num){
        itemService.deductStock(itemId, num);
    }
}
